/*
 * @(#)ColorFilter.java	Sep 30, 2002
 *
 * Copyright 2002 JIDE Software Inc. All rights reserved.
 */
package com.element.ui.icons;

import java.awt.*;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageProducer;
import java.awt.image.RGBImageFilter;

/**
 * An image filter that brightens or darkens an existing image.
 */
public class ColorFilter extends RGBImageFilter {
	private boolean _brighter;
	private static int _percent = 30;
	private static ColorFilter _colorFilter;

	public static ColorFilter getInstance(boolean brighter, int percent) {
		if (_colorFilter == null) {
			_colorFilter = new ColorFilter(brighter, percent);
		} else {
			_colorFilter.setBrighter(brighter);
			setPercent(percent);
		}
		return _colorFilter;
	}

	public void setBrighter(boolean brighter) {
		_brighter = brighter;
	}

	public static void setPercent(int percent) {
		_percent = percent;
	}

	public static int getPercent() {
		return _percent;
	}

	/**
	 * Creates a brighter image
	 *
	 * @param i the original image
	 * @return a brighter image
	 */
	public static Image createBrighterImage(Image i) {
		ColorFilter filter = ColorFilter.getInstance(true, _percent);
		ImageProducer prod = new FilteredImageSource(i.getSource(), filter);
		return Toolkit.getDefaultToolkit().createImage(prod);
	}

	/**
	 * Creates a brighter image with a given percentage of brightness
	 *
	 * @param i the original image
	 * @param p percentage of brightness
	 * @return a brighter image
	 */
	public static Image createBrighterImage(Image i, int p) {
		setPercent(p);
		return createBrighterImage(i);
	}


	/**
	 * Creates a darker image
	 *
	 * @param i the original image
	 * @return a darker image.
	 */
	public static Image createDarkerImage(Image i) {
		ColorFilter filter = ColorFilter.getInstance(false, _percent);
		ImageProducer prod = new FilteredImageSource(i.getSource(), filter);
		return Toolkit.getDefaultToolkit().createImage(prod);
	}


	/**
	 * Creates a darker image with a given percentage of darkness
	 *
	 * @param i the original image
	 * @param p percentage of darkness
	 * @return a darker image.
	 */
	public static Image createDarkerImage(Image i, int p) {
		setPercent(p);
		return createDarkerImage(i);
	}


	/**
	 * Constructs a ColorFilter object that filters a color image to a brighter or a darker image. Please note, you can
	 * also use {@link #getInstance(boolean, int)} to reuse the same instance of ColorFilter.
	 *
	 * @param b a boolean -- true if the pixels should be brightened
	 * @param p an int in the range 0..100 that determines the percentage of gray, where 100 is the darkest gray, and 0
	 *          is the lightest
	 */
	public ColorFilter(boolean b, int p) {
		_brighter = b;
		_percent = p;
		canFilterIndexColorModel = true;
	}

	/**
	 * Overrides <code>RGBImageFilter.filterRGB</code>.
	 */
	@Override
	public int filterRGB(int x, int y, int rgb) {
		int r = (rgb >> 16) & 0xff;
		int g = (rgb >> 8) & 0xff;
		int b = rgb & 0xff;

		return rgb & 0xff000000 | convert(r) << 16 | convert(g) << 8 | convert(b);
	}

	private int convert(int color) {
		if (_brighter)
			color += (255 - color) * _percent / 100;
		else
			color -= (255 - color) * _percent / 100;

		if (color < 0) color = 0;
		if (color > 255) color = 255;
		return color;
	}
}

